from django.db import models
##
##存储指数、板块的全部日K线数据，沪深两市全部个股日K线数据;用于分析各个级别的价格走势和趋势。
# 选择性存储一些个股指定时间段的日分时数据（以1m为周期），用于分析分时走势为未来价格的影响
# 存储部分个股的盘口数据（以3s为周期）。用于分析竞价或者决定分时的资金意图。
#总体来说，ycdata分两个层级，一个层级是平常所记录的市场数据，其中一部分是记录所有日K线数据；第二个层级是利用这些数据提取出深度学习或者强化学习所需要的训练数据，以及部分典型案例的分时数据和3s级盘口数据。
#即数据包括一下三类：1.日K线数据，包括了指数、板块和沪深两市全部个股；（暂不考虑京市）
#                  2.从个股数据中提取部分典型案例的分时数据；
#                  3.从个股数据中提取部分典型案例的3s盘口数据。
#     以上3类数据，都需要对数据再进行处理，形成深度学习或者强化学习的训练数据。对于深度学习来说，需要进行监督学习，对于强化学习来说，就是离线学习，并可以逐步进行在线学习。让智能体跟随市场变化而改变相应的策略。
#     例如：在弱市时如何处理；在震荡市时如何处理；在强市场时如何处理。
##
# Create your models here.

#市场概况，包括了上证指数、深圳指数、创业板指数和上证股票数量、深圳股票数量、科创板股票数量、创业板股票数量和交易日期。
#交易日期从2010年1月4日开始，至最新日期。每次程序启动，都需要从网络上下载最新数据，更新数据至最新。
#市场概况数据表，一方面从市场指数上的数据获取，一方面从当天所有市场日K线数据中统计。
#在Tushare里，上证指数代码为：000001.SH，深证成指为：399001.SZ,创业板指为：399006.SZ.
class MarketProfile(models.Model):
    trade_date = models.DateField()#交易日。日期统一用date，而分时数据则用datetime
    index_sh = models.FloatField(default=0.0)#上证指数
    change_pct_sh = models.FloatField()#涨跌幅
    amount_sh = models.FloatField()#沪市成交量
    index_sz = models.FloatField(default=0.0)#深圳成指
    amount_sz = models.FloatField()#深市成交量
    change_pct_sz = models.FloatField()#涨跌幅
    index_cy = models.FloatField(default=0.0)#创业板指
    change_pct_cy = models.FloatField()#涨跌幅
    inc_num = models.IntegerField()#上涨股票数（含平盘股票数）
    dec_num = models.IntegerField()#下跌股票数
    zt_num = models.IntegerField()#涨停股票数（去除ST股）
    dt_num = models.IntegerField()#跌停股票数（去除ST股）
    north_money = models.FloatField(default=0.0)#北向资金
    
    class Meta:
        db_table = 'market_profile'
        verbose_name = verbose_name_plural ='市场概况表'
    def __str__(self):
        return self.index_sh
#市场交易日列表，从起始日开始计数为1
class MarketTradeDate(models.Model):
    seq = models.IntegerField()
    trade_date = models.DateField()#交易日。
    pre_tradedate = models.DateField()#上一个交易日
    class Meta:
        db_table = 'market_trade_date'
        verbose_name = verbose_name_plural ='市场交易日列表'
    def __str__(self):
        return self.seq


class MarketZtStock(models.Model):
    trade_date = models.DateField()#交易日。
    code =  models.CharField(max_length=10)
    zt_ratio = models.FloatField()#涨跌幅
    close = models.FloatField()
    turn_rate_f = models.FloatField(default=0.0)
    money_flow = models.FloatField(default=0.0)
    zt_times = models.SmallIntegerField()
    class Meta:
        db_table = 'market_zt_stock'
        verbose_name = verbose_name_plural ='市场涨停股票列表'
    def __str__(self):
        return self.code

#1.市场股票列表，随着每次数据更新而更新，保证当前的是最新状态。只存储当前的在市场上的股票列表，当前的列表不考虑ST，不考虑北交所
class StockProfile(models.Model):
    code = models.CharField(max_length=10)
    name = models.CharField(max_length=10)
    area = models.CharField(max_length=10,null=True)
    industry = models.CharField(max_length=10,null=True)#行业。这里还是采用tushare的行业分类。具体板块分类（行业或者概念通过另行的数据库来对个股进行关联）
    market = models.CharField(max_length=10,default='',null=True)#市场类型（主板/科创板/创业板/CDR)
    is_hs = models.CharField(max_length=10,default='N',null=True)
    exchange_ind = models.CharField(max_length=4)#交易所标志，为"sz"或者"sh"
    list_date = models.DateField()#上市日期，有的时候用来计算是否次新，或者计算任意两个日期之间间隔
    cur_date = models.DateField('最后更新日期')#用于与当前最新的列表进行比对，得到更新的间隔
    class Meta:
        db_table = 'stock_profile'
        verbose_name = verbose_name_plural ='市场当前所有个股信息表'
    def __str__(self):
        return self.name
#1.1股票黑名单，包括st等各类因素的不考虑分析或者存储
class StockBlacklist(models.Model):
    code = models.CharField(max_length=10)#600000.sh格式
    list_date = models.DateField()#上市日期
    black_type = models.CharField(max_length=10)#上黑名单原因类型
    class Meta:
        db_table = 'stock_blacklist'
        verbose_name = verbose_name_plural ='个股黑名单'
    def __str__(self):
        return self.code

#2.K线数据，分为600、688,、000、300等四个数据表格。去除st股，暂不考虑北交所个股。
#每个表格数据大概为13年*220交易日*4000个股，大概为300万条数据，且每日多4000条数据
#市场其实每个时候能够操作的个股数量是很少的，只有那些走出来的个股才值得操作。
#所有企图去抄底的个股的概率是很小的。那么寻找这些极少数，就是在市场中最核心的问题。
#这与市场中，只有少数人能够赢利一样，尤其是稳定赢利的人少之又少。那么技术上要解决的就是从
#形态上、从技术走势上，从监测个股发展上，或者从历史数据中发现每只走出来的个股是如何演进的，
#演进时的特征是什么，主要有哪些。这可以通过训练学习的方式去发现。这就是最终要从几千个个股中去
#挑选的最根本原因，也是在市场中赢利的不二法门。
class Stock_kData_600(models.Model):
    code = models.CharField(max_length=10)
    trade_date = models.DateField(null=False,blank=False)#交易日期
    open = models.FloatField(default=0.0,null=False,blank=False)
    high = models.FloatField(default=0.0,null=True,blank=True)#最高价
    low = models.FloatField(default=0.0,null=True,blank=True)#最低价
    close = models.FloatField(default=0.0,null=False,blank=False)#收盘价
    pre_close = models.FloatField(default=0.0,null=False,blank=False)#上一日收盘价
    is_zt = models.BooleanField(default=False,null=False,blank=False)
    volume = models.IntegerField(null=False,blank=False)#成交股数
    amount = models.FloatField(null=True,blank=True)#成交金额（万元）
    turn_rate = models.FloatField(default=0.0,null=True,blank=True)#换手率
    turn_rate_f = models.FloatField(default=0.0,null=True,blank=True)#流通股换手率
    volume_ratio = models.FloatField(default=0.0,null=True,blank=True)#量比
    change_pct = models.FloatField(default=0.0,null=True,blank=True)#涨跌幅
    pe = models.FloatField(default=0.0,null=True,blank=True)#PE
    pb = models.FloatField(default=0.0,null=True,blank=True)#PB
    money_flow = models.FloatField(default=0.0,null=True,blank=True)#流入流出金额（万元）.
    total_mv = models.FloatField(default=0.0,null=True,blank=True)#总市值
    class Meta:
        db_table = 'stock_kdata_600'
        verbose_name = verbose_name_plural ='600市场股票K线数据'
    def __str__(self):
        return self.code

class Stock_kData_688(models.Model):
    code = models.CharField(max_length=10)
    trade_date = models.DateField(null=False,blank=False)#交易日期
    open = models.FloatField(default=0.0,null=False,blank=False)
    high = models.FloatField(default=0.0,null=True,blank=True)#最高价
    low = models.FloatField(default=0.0,null=True,blank=True)#最低价
    close = models.FloatField(default=0.0,null=False,blank=False)#收盘价
    pre_close = models.FloatField(default=0.0,null=False,blank=False)#上一日收盘价
    is_zt = models.BooleanField(default=False,null=False,blank=False)
    volume = models.IntegerField(null=False,blank=False)#成交股数
    amount = models.FloatField(null=True,blank=True)#成交金额（万元）
    turn_rate = models.FloatField(default=0.0,null=True,blank=True)#换手率
    turn_rate_f = models.FloatField(default=0.0,null=True,blank=True)#流通股换手率
    volume_ratio = models.FloatField(default=0.0,null=True,blank=True)#量比
    change_pct = models.FloatField(default=0.0,null=True,blank=True)#涨跌幅
    pe = models.FloatField(default=0.0,null=True,blank=True)#PE
    pb = models.FloatField(default=0.0,null=True,blank=True)#PB
    money_flow = models.FloatField(default=0.0,null=True,blank=True)#流入流出金额（万元）.
    total_mv = models.FloatField(default=0.0,null=True,blank=True)#总市值
    class Meta:
        db_table = 'stock_kdata_688'
        verbose_name = verbose_name_plural ='科创板股票K线数据'
    def __str__(self):
        return self.code
class Stock_kData_zt(models.Model):
    code = models.CharField(max_length=10)
    trade_date = models.DateField(null=False,blank=False)#交易日期
    open = models.FloatField(default=0.0,null=False,blank=False)
    high = models.FloatField(default=0.0,null=True,blank=True)#最高价
    low = models.FloatField(default=0.0,null=True,blank=True)#最低价
    close = models.FloatField(default=0.0,null=False,blank=False)#收盘价
    pre_close = models.FloatField(default=0.0,null=False,blank=False)#上一日收盘价
    is_zt = models.BooleanField(default=False,null=False,blank=False)
    volume = models.IntegerField(null=False,blank=False)#成交股数
    amount = models.FloatField(null=True,blank=True)#成交金额（万元）
    turn_rate = models.FloatField(default=0.0,null=True,blank=True)#换手率
    turn_rate_f = models.FloatField(default=0.0,null=True,blank=True)#流通股换手率
    volume_ratio = models.FloatField(default=0.0,null=True,blank=True)#量比
    change_pct = models.FloatField(default=0.0,null=True,blank=True)#涨跌幅
    pe = models.FloatField(default=0.0,null=True,blank=True)#PE
    pb = models.FloatField(default=0.0,null=True,blank=True)#PB
    money_flow = models.FloatField(default=0.0,null=True,blank=True)#流入流出金额（万元）.
    total_mv = models.FloatField(default=0.0,null=True,blank=True)#总市值
    class Meta:
        db_table = 'stock_kdata_zt'
        verbose_name = verbose_name_plural ='涨停股票K线数据'
    def __str__(self):
        return self.code

# class Stock_kData_300_zt(models.Model):
#     code = models.CharField(max_length=10)
#     trade_date = models.DateField(null=False,blank=False)#交易日期
#     open = models.FloatField(default=0.0,null=False,blank=False)
#     high = models.FloatField(default=0.0,null=True,blank=True)#最高价
#     low = models.FloatField(default=0.0,null=True,blank=True)#最低价
#     close = models.FloatField(default=0.0,null=False,blank=False)#收盘价
#     pre_close = models.FloatField(default=0.0,null=False,blank=False)#上一日收盘价
#     is_zt = models.BooleanField(default=False,null=False,blank=False)
#     volume = models.IntegerField(null=False,blank=False)#成交股数
#     amount = models.FloatField(null=True,blank=True)#成交金额（万元）
#     turn_rate = models.FloatField(default=0.0,null=True,blank=True)#换手率
#     turn_rate_f = models.FloatField(default=0.0,null=True,blank=True)#流通股换手率
#     volume_ratio = models.FloatField(default=0.0,null=True,blank=True)#量比
#     change_pct = models.FloatField(default=0.0,null=True,blank=True)#涨跌幅
#     pe = models.FloatField(default=0.0,null=True,blank=True)#PE
#     pb = models.FloatField(default=0.0,null=True,blank=True)#PB
#     money_flow = models.FloatField(default=0.0,null=True,blank=True)#流入流出金额（万元）.
#     total_mv = models.FloatField(default=0.0,null=True,blank=True)#总市值
#     class Meta:
#         db_table = 'stock_kdata_300_zt'
#         verbose_name = verbose_name_plural ='涨停股票K线数据300'
#     def __str__(self):
#         return self.code

# class Stock_kData_600_zt(models.Model):
#     code = models.CharField(max_length=10)
#     trade_date = models.DateField(null=False,blank=False)#交易日期
#     open = models.FloatField(default=0.0,null=False,blank=False)
#     high = models.FloatField(default=0.0,null=True,blank=True)#最高价
#     low = models.FloatField(default=0.0,null=True,blank=True)#最低价
#     close = models.FloatField(default=0.0,null=False,blank=False)#收盘价
#     pre_close = models.FloatField(default=0.0,null=False,blank=False)#上一日收盘价
#     is_zt = models.BooleanField(default=False,null=False,blank=False)
#     volume = models.IntegerField(null=False,blank=False)#成交股数
#     amount = models.FloatField(null=True,blank=True)#成交金额（万元）
#     turn_rate = models.FloatField(default=0.0,null=True,blank=True)#换手率
#     turn_rate_f = models.FloatField(default=0.0,null=True,blank=True)#流通股换手率
#     volume_ratio = models.FloatField(default=0.0,null=True,blank=True)#量比
#     change_pct = models.FloatField(default=0.0,null=True,blank=True)#涨跌幅
#     pe = models.FloatField(default=0.0,null=True,blank=True)#PE
#     pb = models.FloatField(default=0.0,null=True,blank=True)#PB
#     money_flow = models.FloatField(default=0.0,null=True,blank=True)#流入流出金额（万元）.
#     total_mv = models.FloatField(default=0.0,null=True,blank=True)#总市值
#     class Meta:
#         db_table = 'stock_kdata_600_zt'
#         verbose_name = verbose_name_plural ='涨停股票K线数据600'
#     def __str__(self):
#         return self.code

# class Stock_kData_688_zt(models.Model):
#     code = models.CharField(max_length=10)
#     trade_date = models.DateField(null=False,blank=False)#交易日期
#     open = models.FloatField(default=0.0,null=False,blank=False)
#     high = models.FloatField(default=0.0,null=True,blank=True)#最高价
#     low = models.FloatField(default=0.0,null=True,blank=True)#最低价
#     close = models.FloatField(default=0.0,null=False,blank=False)#收盘价
#     pre_close = models.FloatField(default=0.0,null=False,blank=False)#上一日收盘价
#     is_zt = models.BooleanField(default=False,null=False,blank=False)
#     volume = models.IntegerField(null=False,blank=False)#成交股数
#     amount = models.FloatField(null=True,blank=True)#成交金额（万元）
#     turn_rate = models.FloatField(default=0.0,null=True,blank=True)#换手率
#     turn_rate_f = models.FloatField(default=0.0,null=True,blank=True)#流通股换手率
#     volume_ratio = models.FloatField(default=0.0,null=True,blank=True)#量比
#     change_pct = models.FloatField(default=0.0,null=True,blank=True)#涨跌幅
#     pe = models.FloatField(default=0.0,null=True,blank=True)#PE
#     pb = models.FloatField(default=0.0,null=True,blank=True)#PB
#     money_flow = models.FloatField(default=0.0,null=True,blank=True)#流入流出金额（万元）.
#     total_mv = models.FloatField(default=0.0,null=True,blank=True)#总市值
#     class Meta:
#         db_table = 'stock_kdata_688_zt'
#         verbose_name = verbose_name_plural ='涨停股票K线数据688'
#     def __str__(self):
#         return self.code

class Stock_kData_000(models.Model):
    code = models.CharField(max_length=10)
    trade_date = models.DateField(null=False,blank=False)#交易日期
    open = models.FloatField(default=0.0,null=False,blank=False)
    high = models.FloatField(default=0.0,null=True,blank=True)#最高价
    low = models.FloatField(default=0.0,null=True,blank=True)#最低价
    close = models.FloatField(default=0.0,null=False,blank=False)#收盘价
    pre_close = models.FloatField(default=0.0,null=False,blank=False)#上一日收盘价
    is_zt = models.BooleanField(default=False,null=False,blank=False)
    volume = models.IntegerField(null=False,blank=False)#成交股数
    amount = models.FloatField(null=True,blank=True)#成交金额（万元）
    turn_rate = models.FloatField(default=0.0,null=True,blank=True)#换手率
    turn_rate_f = models.FloatField(default=0.0,null=True,blank=True)#流通股换手率
    volume_ratio = models.FloatField(default=0.0,null=True,blank=True)#量比
    change_pct = models.FloatField(default=0.0,null=True,blank=True)#涨跌幅
    pe = models.FloatField(default=0.0,null=True,blank=True)#PE
    pb = models.FloatField(default=0.0,null=True,blank=True)#PB
    money_flow = models.FloatField(default=0.0,null=True,blank=True)#流入流出金额（万元）.
    total_mv = models.FloatField(default=0.0,null=True,blank=True)#总市值
    class Meta:
        db_table = 'stock_kdata_000'
        verbose_name = verbose_name_plural ='深圳主板股票K线数据'
    def __str__(self):
        return self.code
#tushare的数据都是不复权的数据
class Stock_kData_300(models.Model):
    code = models.CharField(max_length=10)
    trade_date = models.DateField(null=False,blank=False)#交易日期
    open = models.FloatField(default=0.0,null=False,blank=False)
    high = models.FloatField(default=0.0,null=True,blank=True)#最高价
    low = models.FloatField(default=0.0,null=True,blank=True)#最低价
    close = models.FloatField(default=0.0,null=False,blank=False)#收盘价
    pre_close = models.FloatField(default=0.0,null=False,blank=False)#上一日收盘价
    is_zt = models.BooleanField(default=False,null=False,blank=False)
    volume = models.IntegerField(null=False,blank=False)#成交股数
    amount = models.FloatField(null=True,blank=True)#成交金额（万元）
    turn_rate = models.FloatField(default=0.0,null=True,blank=True)#换手率
    turn_rate_f = models.FloatField(default=0.0,null=True,blank=True)#流通股换手率
    volume_ratio = models.FloatField(default=0.0,null=True,blank=True)#量比
    change_pct = models.FloatField(default=0.0,null=True,blank=True)#涨跌幅
    pe = models.FloatField(default=0.0,null=True,blank=True)#PE
    pb = models.FloatField(default=0.0,null=True,blank=True)#PB
    money_flow = models.FloatField(default=0.0,null=True,blank=True)#流入流出金额（万元）.
    total_mv = models.FloatField(default=0.0,null=True,blank=True)#总市值
    class Meta:
        db_table = 'stock_kdata_300'
        verbose_name = verbose_name_plural ='创业板股票K线数据'
    def __str__(self):
        return self.code

#记录所有的风格、概念和行业板块的具体关系，即某一个板块包括的全部个股的代码和数量等信息
class Block_profile(models.Model):
    block_code = models.CharField(max_length=10)
    block_name = models.CharField(max_length=10)
    total_num = models.IntegerField(default=0)
    #只存储code，而不存储名称。因为一些st个股不在考虑范围内，所以就无法获取其名称。而是通过判断正常个股的代码是否在板块中，来确定板块与个股之间的关系
    stock_code = models.CharField(max_length=10)
    block_type = models.CharField(max_length=5)
    class Meta:
        db_table = 'block_profile'
        verbose_name = verbose_name_plural ='板块基本信息'
    def __str__(self):
        return self.block_code
#记录全部概念和行业板块的条目。仅仅条目，用于获取日K线数据。
#市场的炒作基本围绕概念和行业来的，形成主线的都是概念和行业，所以只关注概念和行业两类板块的K线数据。
class Block_profile_main(models.Model):
    block_code = models.CharField(max_length=10)
    block_name = models.CharField(max_length=10)
    total_num = models.IntegerField(default=0)
    block_type = models.CharField(max_length=5)#注意行业中，有些只有一级行业。如果有二级行业，则以二级行业为准。
    class Meta:
        db_table = 'block_main_profile'
        verbose_name = verbose_name_plural ='主要板块基本信息'
    def __str__(self):
        return self.block_code
#概念板块和行业板块的日K线数据，目前按照2400天来
class Block_Main_kData_day(models.Model):
    code = models.CharField(max_length=10)
    trade_date = models.DateField(null=False,blank=False)#交易日期
    open = models.FloatField(default=0.0,null=False,blank=False)
    high = models.FloatField(default=0.0,null=True,blank=True)#最高价
    low = models.FloatField(default=0.0,null=True,blank=True)#最低价
    close = models.FloatField(default=0.0,null=False,blank=False)#收盘价
    pre_close = models.FloatField(default=0.0,null=False,blank=False)#上一日收盘价
    volume = models.IntegerField(null=False,blank=False)#成交股数
    amount = models.FloatField(null=True,blank=True)#成交金额（万元）
    change_pct = models.FloatField(default=0.0,null=True,blank=True)#涨跌幅
    up_num = models.IntegerField(null=False)#上涨家数
    down_num = models.IntegerField(null=False)#上涨家数
    zt_num = models.IntegerField(null=False,default=0)#涨停家数
    #去掉跌停，在于分析涨停更有意义。进入主线后，再分析跌停。
    # dt_num = models.IntegerField(null=False,default=0)#跌停家数

    class Meta:
        db_table = 'block_main_kdata'
        verbose_name = verbose_name_plural ='主要板块日K线'
    def __str__(self):
        return self.code
#专门建立一个数据表，来记录各类型数据最新更新日期
class Market_data_cur_date(models.Model):
    stock_cur_date = models.DateField(null=True,blank=True)
    market_cur_date = models.DateField(null=True,blank=True)#
    block_cur_date  = models.DateField(null=True,blank=True)#
    zt_stat_cur_date = models.DateField(null=True,blank=True)
    block_file_cur_date = models.DateField(null=True,blank=True)
    stock_last_date = models.DateField(null=True,blank=True)
    market_last_date = models.DateField(null=True,blank=True)#
    block_last_date  = models.DateField(null=True,blank=True)#
    zt_stat_last_date = models.DateField(null=True,blank=True)
    block_file_last_date = models.DateField(null=True,blank=True)
    class Meta:
        db_table = 'market_data_date'
        verbose_name = verbose_name_plural ='市场各类数据当前日期'
    def __str__(self):
        return self.market_cur_date
class Market_data_update_stat(models.Model):
    update_date = models.DateField(null=True,blank=True)
    trade_date_start = models.DateField(null=True,blank=True)
    trade_date_end = models.DateField(null=True,blank=True)#
    code  = models.CharField(max_length=10)
    name  = models.CharField(max_length=10)
    code_type = models.CharField(max_length=5)
    event_type = models.CharField(max_length=20)
    class Meta:
        db_table = 'market_data_update_stat'
        verbose_name = verbose_name_plural ='市场数据更新统计数据'
    def __str__(self):
        return self.code
#discard ....
# class Stock_update_history_statistics(models.Model):
    
#     update_date_now = models.DateField(null=True,blank=True)#
#     update_start_date = models.DateField(null=True,blank=True)
#     is_init = models.BooleanField(default=False)
#     #下一个交易日即将上市的，
#     stock_next_num = models.SmallIntegerField(default=0)
#     stocks_on_list_next = models.CharField(max_length=100)
#     #摘帽解除ST的个股
#     stock_de_st_num = models.SmallIntegerField(default=0)
#     stocks_de_st= models.CharField(max_length=100)
#     #新股，原来数据中没有的
#     stock_new_num = models.SmallIntegerField(default=0)
#     stocks_new_on_list = models.CharField(max_length=100)
#     #退市的个股
#     stock_del_num = models.SmallIntegerField(default=0)
#     stocks_delete_list = models.CharField(max_length=100)
#     #总更新的股票数量
#     update_stock_num = models.IntegerField(default=0)


#     class Meta:
#         db_table = 'stock_update_stat'
#         verbose_name = verbose_name_plural ='股票更新日志'
#     def __str__(self):
#         return self.update_date_now